# 导入JsonResponse类，用于处理HTTP响应，返回JSON格式的数据
from django.http import JsonResponse

# 导入View类，它是Django中的视图类，用于处理Web请求
from django.views import View
# 导入DRF JWT认证所需的设置
from rest_framework_jwt.settings import api_settings


from user.models import SysUser

# 登录功能接口实现
class LoginView(View):
    """
    处理用户登录请求的视图类
    继承自Django的View类，用于处理HTTP POST请求
    """

    def post(self, request):
        """
        处理POST请求的方法
        从请求中提取用户名和密码，验证用户身份，并返回JWT令牌
        参数:
        - request: HttpRequest对象，包含登录请求的数据
        返回:
        - JsonResponse对象，包含登录结果信息和JWT令牌（如果登录成功）
        """
        # 从POST请求的参数中获取用户名和密码
        username = request.GET.get('username')
        password = request.GET.get('password')
        print('username:', username)
        print('password:', password)

        try:
            # 尝试根据用户名和密码查询SysUser模型中的用户
            user = SysUser.objects.get(username=username, password=password)

            # 获取JWT的payload处理器和编码处理器
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

            # 使用payload处理器处理用户对象，生成payload
            payload = jwt_payload_handler(user)

            # 使用编码处理器将payload编码为JWT字符串
            token = jwt_encode_handler(payload)
        except Exception as e:
            # 如果查询用户时发生异常，打印异常信息并返回错误响应
            print(e)
            return JsonResponse({'code': 500, 'info': '用户名或者密码错误！'})

        # 如果用户验证成功，返回包含JWT令牌的响应
        # return JsonResponse({'code': 200, 'token': token, 'info': '登录成功！'})
        # 返回一个包含用户信息的JSON响应
        # 包含以下信息:
        # - code: 状态码，200表示成功
        # - token: 用户的认证令牌
        # - user: 当前登录用户的序列化信息，使用SysUserSerializer进行序列化
        # - info: 登录成功提示信息
        return JsonResponse({'code': 200, 'token': token, 'info': '登录成功！'})



class TestView(View):
    """
    测试视图类，用于处理GET请求并返回测试信息。
    继承自Django的View类，以类视图的方式处理请求。
    """
    def get(self, request):
        """
        处理GET请求的方法。
        参数:
        - request: HttpRequest对象，包含请求的相关信息。
        返回:
        - JsonResponse对象: 包含响应信息的JSON对象，包括状态码和测试信息。
        此方法响应GET请求，并返回一个包含{'code': 200, 'info': '测试！'}的JSON响应。
        """
        # # 获取所有系统⽤户对象
        # userList_obj = SysUser.objects.all()
        # print(userList_obj, type(userList_obj))
        #
        # # 将QuerySet对象转换为字典，便于进⼀步处理
        # userList_dict = userList_obj.values()  # 转存字典
        # print(userList_dict, type(userList_dict))
        #
        # # 将字典的外层容器转换为List，以便于JSON序列化
        # userList = list(userList_dict)  # 把外层的容器转为List
        # print(userList, type(userList))

        # 获取系统用户信息并以JSON格式返回
        # 这里使用了ORM方式从SysUser模型中获取所有用户信息，并将这些信息转换为字典列表
        # 之后，通过JsonResponse返回一个包含用户数据的JSON响应
        # 注意：此处的用户信息包括所有字段，可能需要根据实际需求进行调整以增强安全性

        # 获取请求中的授权令牌
        token = request.META.get('HTTP_AUTHORIZATION')
        print("token:", token)
        if token != None and token != '':
            userList =list(SysUser.objects.all().values())
            return JsonResponse({'code': 200, 'info': '测试！', 'data': userList})
        else:
            return JsonResponse({'code': 401, 'info': '无权限访问！'})



class JwtTestView(View):
    """
    JwtTestView类继承自View，用于处理JWT相关的测试请求。
    主要功能是生成和返回一个JWT token。
    """

    def get(self, request):
        """
        处理GET请求的方法。
        从请求中生成JWT token，并以JSON格式返回。

        参数:
        - request: HttpRequest对象，包含请求的相关信息。

        返回:
        - JsonResponse: 包含JWT token的JSON响应。
        """
        # 直接从数据库中获取指定用户名和密码的用户对象
        user = SysUser.objects.get(username='admin', password='123456')
        # 从API设置中获取JWT payload处理函数和编码处理函数
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER  # 小写快捷键ctrl + shift + U
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
        # 将用户对象传递进去，获取到该对象的属性值
        payload = jwt_payload_handler(user)
        # 将属性值编码成jwt格式的字符串
        token = jwt_encode_handler(payload)
        # 返回包含JWT token的JSON响应
        return JsonResponse({'code': 200, 'token': token})
